/*

 Copyright (C) 2010 Tiago Matos Santos <tiagoms88 AT gmail DOT com>
   
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Library General Public License as
 published by the Free Software Foundation; either version 2 of the
 License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.

 You should have received a copy of the GNU Library General Public
 License along with this program; if not, write to the
 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
*/

#include <QMessageBox>
#include <QTimer>
#include <qextserialbase.h>
#include "Programa.h"
#include "especifico.h"

/////////////////////////////////////////////////////////////////////
// ModeloPortaSerial
/////////////////////////////////////////////////////////////////////
ModeloPortaSerial::ModeloPortaSerial(QString porta, BaudRateType velocidade) { ////////////// TERMINE !!!!!!!!!
    this->porta = porta;
    this->velocidade = velocidade;
    this->controleFluxo = FLOW_OFF;
    this->paridade = PAR_NONE;
    this->bitsDados = DATA_8;
    this->bitsParada = STOP_1;

    portaSerial = new QextSerialPort(porta);

    portaSerial->setBaudRate(velocidade);
    portaSerial->setFlowControl(controleFluxo);
    portaSerial->setParity(paridade);
    portaSerial->setDataBits(bitsDados);
    portaSerial->setStopBits(bitsParada);

    portaSerial->open(QIODevice::ReadWrite);
}

ModeloPortaSerial::~ModeloPortaSerial() { ////////////// TERMINE !!!!!!!!!
	
}

/*
 Reseta a porta
*/
void ModeloPortaSerial::resetaPortaSerial() {
    if(portaSerial->isOpen())
    {
        portaSerial->close();
    }
    delete portaSerial;

    portaSerial = new QextSerialPort(porta);

    portaSerial->setBaudRate(velocidade);
    portaSerial->setFlowControl(controleFluxo);
    portaSerial->setParity(paridade);
    portaSerial->setDataBits(bitsDados);
    portaSerial->setStopBits(bitsParada);

    portaSerial->open(QIODevice::ReadWrite);
}

/////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////
// MainWindow
/////////////////////////////////////////////////////////////////////
MainWindow::MainWindow() {
    setupUi(this);

    modelPorta = new ModeloPortaSerial(PORTA1, BAUD9600);

    if(!modelPorta->portaSerial->isOpen())
    {
        QMessageBox::information(this, tr("Erro"), QLatin1String("Não foi possível abrir a porta serial."));
    }
	
	connect( botaoEnviar, SIGNAL(clicked(bool)), this, SLOT( actionEnviar() ) );
	connect( botaoReceber, SIGNAL(clicked(bool)), this, SLOT( actionReceber() ) );
    connect( botaoStatus, SIGNAL(clicked(bool)), this, SLOT( actionStatus() ) );

    receberThread.start();
}

MainWindow::~MainWindow() {
    receberThread.wait();
}

void MainWindow::actionEnviar() {
    int qtd = 0;
    qtd = modelPorta->portaSerial->write( textoEnviar->toPlainText().toLatin1(), textoEnviar->toPlainText().size() );

    QMessageBox::information(this, tr("Info"), QString("Enviados: %1").arg(qtd));
}

void MainWindow::actionReceber() {
    if(modelPorta->portaSerial->bytesAvailable()) {
        textoRecebido->moveCursor(QTextCursor::End);
        textoRecebido->insertPlainText(QString::fromLatin1(modelPorta->portaSerial->readAll()));
    }
}

void MainWindow::actionStatus() {
    QString msg = "?";

    if(modelPorta->portaSerial->isOpen()) msg = "OK";

    QMessageBox::information(this, tr("Info"), msg);
}

void MainWindow::on_actionSair_triggered() {
    modelPorta->portaSerial->close();
}

void MainWindow::on_actionSobre_triggered() {
	Sobre *sobre = new Sobre(this);
	sobre->exec();
}

void MainWindow::on_actionComunicacao_triggered() {
	cfgCom = new ConfigComunicacao(this);
	cfgCom->exec();
}


/////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////
// ConfigComunicacao
/////////////////////////////////////////////////////////////////////
ConfigComunicacao::ConfigComunicacao(QWidget *parent) {
    setupUi(this);

	modelPort = dynamic_cast<MainWindow*> (parent)->modelPorta;
	
	inputSerialPorta->clear();
    inputSerialPorta->setText( modelPort->porta.toLatin1() );
    inputSerialVelocidade->setCurrentIndex( modelPort->velocidade );
    inputSerialFluxo->setCurrentIndex( modelPort->controleFluxo );
    inputSerialParidade->setCurrentIndex( modelPort->paridade );
	
    connect( botaoOK, SIGNAL(clicked(bool)), this, SLOT(actionAtualizarConfigPorta()) );
}

void ConfigComunicacao::actionAtualizarConfigPorta() { ////////////// TERMINE !!!!!!!!!

    modelPort->porta = inputSerialPorta->text();
    modelPort->velocidade = (BaudRateType) inputSerialVelocidade->currentIndex();
    modelPort->controleFluxo = (FlowType) inputSerialFluxo->currentIndex();
    modelPort->paridade = (ParityType) inputSerialParidade->currentIndex();

    modelPort->resetaPortaSerial();

    if(!modelPort->portaSerial->isOpen())
    {
        QMessageBox::information(this, tr("Erro"), QLatin1String("Problema ao reconfigurar a porta serial."));
    }
}
/////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////
// Sobre
/////////////////////////////////////////////////////////////////////
Sobre::Sobre(QWidget *parent) {
	setupUi(this);
}
/////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////
// ReceberThread
/////////////////////////////////////////////////////////////////////

ReceberThread::ReceberThread(QObject* parent) : QThread(parent)
{
}

ReceberThread::~ReceberThread()
{
}

void ReceberThread::run()
{
    while(true)
    {

    }
    exec();
}

//void ReceberThread::setData(int someData)
//{
//    data = someData;

//    emit dataChanged();
//}
/////////////////////////////////////////////////////////////////////
